package recursion;

/**
 * @program: play-structure
 * 移除链表元素,删除链表中等于给定值 val 的所有节点，使用虚拟头节点
 * @author: baichen
 **/
public class RemoveLinkedListElement3 {
    public ListNode removeElements(ListNode head, int val) {
        //dummyHead  是虚拟头结点，永远不会访问到，所以随意设置为 -1
        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;    //dummyHead 成为第一个节点的前一个节点
        ListNode prev = dummyHead;  //从头查看下一个元素是否是待删除元素
        while (prev.next != null) {
            if (prev.next.val == val)
                prev.next = prev.next.next;
            else
                prev = prev.next;
        }

        return dummyHead.next;      //要返回虚拟头结点的下一个
    }

    public static void main(String[] args) {
        int[] nums = {1, 2, 6, 3, 4, 5, 6};	//声明数组
        ListNode head = new ListNode(nums);	//构造函数中传入数组nums
        System.out.println(head);	//打印以 head 作为头结点的整个链表对应的字符串

        ListNode res = (new RemoveLinkedListElement3()).removeElements(head, 6);//将 head 和待删除节点6作为参数传入
        System.out.println(res);
    }
}
